import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;

public class UseFileChannel {
    private static final int SIZE = 1024;

    public static void main(String[] args) throws Exception {
        //获取写操作通道
        FileChannel fc = new FileOutputStream("data.txt").getChannel();
        //将字节数组包装到缓冲区
        fc.write(ByteBuffer.wrap("write text to data.txt hello. my name is dangkei.".getBytes()));
        //关闭通道
        fc.close();

        //随机读写文件流创建的通道
        fc = new RandomAccessFile("data.txt", "rw").getChannel();
        //fc.position()计算从文件开始到当前位置之间字节数
        System.out.println("此通道的文件位置" + fc.position());
        //设置此通道的文件位置， fc.size()此通道的文件当前大小， 该语句执行后， 通道位置处于文件 末尾
        fc.position(fc.size());
        //追加 文本
        fc.write(ByteBuffer.wrap("\n我又写了一些文本进去\n".getBytes()));
        System.out.println("写完后通道的文件位置为" + fc.position());
        fc.close();

        //使用通道读取文件
        fc = new FileInputStream("data.txt").getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(SIZE);
        //将文件读取打制定缓冲区
        fc.read(buffer);
        buffer.flip();  //从头开始读 position(0)
        //while (buffer.hasRemaining()){
        // System.out.println((char)buffer.get());
        //}
        System.out.println(Charset.forName("UTF-8").decode(buffer).toString());
        fc.close();
    }
}
